home *** CD-ROM | disk | FTP | other *** search
- #!/usr/local/bin/wish -f
- ###############################################################################
- # $Id: help.tk,v 1.3 1995/06/29 22:42:23 bmott Exp $
- ###############################################################################
- #
- # HelpMe - A hype-text help facility for Tcl/Tk.
- #
- # By: Bradford W. Mott October 5,1993
- #
- # Imbedded Usage: HelpMe { filename top_node widget_name window_name }
- # filename - help file to display
- # widget_name - help's widget base name
- # window_name - window managers name
- ###############################################################################
- # $Log: help.tk,v $
- # Revision 1.3 1995/06/29 22:42:23 bmott
- # Changed font resources
- #
- # Revision 1.2 1995/01/01 03:03:19 bmott
- # Changed ToNode highlight and took out the Top button
- #
- # Revision 1.1 1994/02/18 20:29:13 bmott
- # Initial revision
- #
- ###############################################################################
-
- proc NOP {} {}
-
- proc PreviousNode {w stackvar info} {
- global $stackvar
-
- eval "set stack \$$stackvar"
- if {[llength $stack] != 1} {
- set new_stack "[lrange $stack 0 [expr [llength $stack]-2]]"
- eval "set $stackvar \"$new_stack\""
-
- set node "[lindex $new_stack [expr [llength $new_stack]-1]]"
- display_node "$node" $info $w
- }
- }
-
- proc RemoveHigh {w} {
- $w tag remove ToNodeHigh 1.0 end
- }
-
- proc AddHigh { x y w} {
- set range [$w tag nextrange ToNodeTag "@$x,$y linestart" "@$x,$y lineend"]
- while {1} {
- if {[$w compare "@$x,$y" >= [lindex $range 0]] && \
- [$w compare "@$x,$y" <= [lindex $range 1]]} {
- $w tag remove ToNodeHigh 1.0 end
- $w tag add ToNodeHigh [lindex $range 0] [lindex $range 1]
- break;
- } else {
- set range [$w tag nextrange ToNodeTag [lindex $range 1] "@$x,$y lineend"]
- }
- }
- }
-
- proc ToNodeBind { x y w info stackvar} {
- global $stackvar
-
- set range [$w tag nextrange ToNodeTag "@$x,$y linestart" "@$x,$y lineend"]
- while {1} {
- if {[$w compare "@$x,$y" >= [lindex $range 0]] && \
- [$w compare "@$x,$y" <= [lindex $range 1]]} {
- eval "lappend $stackvar \"[$w get [lindex $range 0] [lindex $range 1]]\""
- display_node [$w get [lindex $range 0] [lindex $range 1]] $info $w
- break
- } else {
- set range [$w tag nextrange ToNodeTag [lindex $range 1] "@$x,$y lineend"]
- }
- }
- }
-
- ###############################################################################
- # This routine parses a line and displays it in the text widget
- ###############################################################################
- proc add_node_text { line w } {
- while {1} {
- set first [string first "#" $line]
- if {$first != 0} {
- if {$first > 0} {
- set arg [string range $line 0 [expr $first-1]]
- set line [string range $line $first end]
- $w insert end $arg
- $w tag remove NodeTag "end - [string length $arg] chars" "end"
- $w tag remove ToNodeTag "end - [string length $arg] chars" "end"
- } else {
- $w insert end $line\n
- $w tag remove NodeTag "end - [expr [string length $line]+1] chars" \
- "end"
- $w tag remove ToNodeTag "end - [expr [string length $line]+1] chars" \
- "end"
- break;
- }
- } else {
- set last [string first ">" $line]
- if {$last == -1} {
- } else {
- set command [string range $line $first $last]
- set arg [string range $command [expr [string first "<" $command]+1] \
- [expr $last-1]]
- set line [string range $line [expr $last+1] end]
-
- if {[regexp {^#Node<} $command] == 1} {
- $w insert end $arg
- $w tag add NodeTag "end - [string length $arg] chars" "end"
- }
- if {[regexp {^#ToNode<} $command] == 1} {
- $w insert end $arg
- $w tag add ToNodeTag "end - [string length $arg] chars" "end"
- }
- }
- }
- }
- }
-
- proc display_node { node info w } {
- $w delete 0.0 end
- set start [lsearch -regexp $info "#Node<$node>"]
- set end [lsearch -regexp $info "#NodeEnd<$node>"]
- set node_text [lrange $info $start $end]
- foreach i $node_text {add_node_text $i $w}
- }
-
- proc HelpMe { filename w name } {
- set stackname [string range $w 1 end]_global_stack
- global $stackname
-
- catch {destroy $w}
- toplevel $w
- wm title $w "$name"
- wm iconname $w "$name"
-
- set file [open $filename {r}]
- set info [read $file]
- close $file
- set info [split $info \n]
-
- ## Find the top level node
- foreach i $info {
- if {[regexp {^#TopLevelNode<} $i] == 1} {
- set top_node [string range $i [expr [string first "<" $i]+1] \
- [expr [string first ">" $i]-1]]
- break
- }
- }
-
- text $w.helpText -cursor left_ptr -yscrollcommand "$w.scroll set"
- bind $w.helpText <Any-KeyPress> "NOP"
- bind $w.helpText <Any-ButtonPress> "NOP"
- bind $w.helpText <Any-Motion> "NOP"
- bind $w.helpText <Any-Double-ButtonPress> "NOP"
-
- scrollbar $w.scroll -relief raised \
- -command "$w.helpText yview"
-
- frame $w.buttons -borderwidth 2 -relief sunken
- button $w.buttons.previous -text "Previous" \
- -command "PreviousNode $w.helpText $stackname {$info}"
- button $w.buttons.dismiss -text "Dismiss" \
- -command "destroy $w"
- pack $w.buttons.previous -side left -fill x -expand 1 -padx 8 -pady 2
- pack $w.buttons.dismiss -side left -fill x -expand 1 -padx 8 -pady 2
-
- pack $w.buttons -side bottom -fill x -expand 1
- pack $w.scroll -side left -fill y -expand 1
- pack $w.helpText -side left -fill both -expand 1 -padx 4
-
- $w.helpText tag configure NodeTag -font -*-helvetica-medium-o-normal--*-180-*-*-*-*-iso8859-* \
- -underline 1 -foreground Red
- $w.helpText tag configure ToNodeTag -underline 1
- $w.helpText tag configure ToNodeHigh -background White
- $w.helpText tag bind ToNodeTag <Button-1> \
- "ToNodeBind %x %y $w.helpText {$info} $stackname"
- $w.helpText tag bind ToNodeTag <Any-Enter> \
- "AddHigh %x %y $w.helpText"
- $w.helpText tag bind ToNodeTag <Any-Leave> \
- "RemoveHigh $w.helpText"
-
- ## Setup the stack
- eval "set $stackname \"\""
- eval "lappend $stackname \"$top_node\""
-
- display_node $top_node $info $w.helpText
- }
-
-